#include<iostream>
#include<unistd.h>
#include<pthread.h>

using namespace std;

int cnt=0;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;

void* Count(void* args)
{
    pthread_detach(pthread_self());//分离线程
    uint64_t number=(uint64_t)args;
    cout<<"pthread: "<<number<<",create success"<<endl;
    while(1)
    {
        pthread_mutex_lock(&mutex);
        // 我们怎么知道我们要让一个线程去休眠了那？一定是临界资源不就绪，没错，临界资源也是有状态的！！
        // 你怎么知道临界资源是就绪还是不就绪的？你判断出来的！判断是访问临界资源吗？必须是的，也就是判断必须在加锁之后！！！
        pthread_cond_wait(&cond,&mutex);
        //为什么这个函数在这里？因为临界资源不就绪，就要等待
        //为什么还要一个锁的参数？因为这个线程在前面的时候申请了锁，此时线程持有锁
        //1.pthread_cond_wait让线程等待的时候，会自动释放锁！2.唤醒而返回的时候，重新持有锁
        cout<<"pthread: "<<number<<", cnt: "<<cnt++<<endl;
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
    return nullptr;
}
int main()
{
    for(uint64_t i=0;i<5;i++)
    {
        pthread_t tid;
        pthread_create(&tid,nullptr,Count,(void*)i);
        usleep(1000);
    }
    //让主线程把等待的线程唤醒
    while(1)
    {
        sleep(1);
        pthread_cond_signal(&cond);//唤醒条件变量下的一个线程，默认第一个开始
        cout<<"signal one thread..."<<endl;

    }
    return 0;
}